-- KEYS[1] 加锁的对象（也就是我们传入的的锁名称）
-- ARGV[1] 表示锁的过期时间
-- ARGV[2]：UUID+当前线程id
-- 如果锁不存在。 == 0表示不存在 == 1表示存在
if (redis.call('exists', KEYS[1]) == 0) then
    -- 对我自己的锁执行一个incrby（自增，表示锁的可重入次数）操作
    redis.call('hincrby', KEYS[1], ARGV[2], 1);
    -- 对key设置一个过期时间
    redis.call('pexpire', KEYS[1], ARGV[1]);
    -- 返回nil, 相当于null, 表示获取锁成功
    return nil;
end ;
-- 继续判断锁名成+UUID+当前线程id是否存在，其实就是判断我自己有没有已经拿到锁
if (redis.call('hexists', KEYS[1], ARGV[2]) == 1) then
    -- 自己已经持有锁，执行一个incrby（自增，表示锁的可重入次数）操作
    redis.call('hincrby', KEYS[1], ARGV[2], 1);
    -- 重新设置过期时间
    redis.call('pexpire', KEYS[1], ARGV[1]);
    -- 返回nil, 相当于null, 表示获取锁成功
    return nil;
end ;
-- 都不是，表示已经有其他客户端获取到了锁，此时返回key的过期时间，也就是别人释放锁的时间（但其他客户端可能出现续约，存在会等待更久的可能）
return redis.call('pttl', KEYS[1]);